package com.kyrie.lib_sys.utils.learn.TimeDemo;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class TimeDemo04 {
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    public static List<Map<String, String>> timeList = new ArrayList<>();

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入要添加的时间记录数量：");
        int count = Integer.parseInt(scanner.nextLine());

        for (int i = 0; i < count; i++) {
            System.out.println("第" + (i + 1) + "条记录：");

            System.out.print("请输入 prepareTime（格式 yyyy-MM-dd HH:mm:ss）：");
            String prepareTime = scanner.nextLine();

            System.out.print("请输入 travelTime（格式 yyyy-MM-dd HH:mm:ss）：");
            String travelTime = scanner.nextLine();

            System.out.print("请输入 startTime（格式 yyyy-MM-dd HH:mm:ss）：");
            String startTime = scanner.nextLine();

            System.out.print("请输入 completeTime（格式 yyyy-MM-dd HH:mm:ss）：");
            String completeTime = scanner.nextLine();

            timeList.add(Map.of(
                    "prepareTime", prepareTime,
                    "travelTime", travelTime,
                    "startTime", startTime,
                    "completeTime", completeTime
            ));
        }

        // 进行工时校验
        System.out.println("校验结果：" + timeCheck(timeList));
    }

    /**
     * 工时时间校验
     * @param timeList 时间记录列表
     * @return true-校验通过 false-校验失败
     */
    public static boolean timeCheck(List<Map<String, String>> timeList) {
        if (timeList == null || timeList.isEmpty()) {
            System.out.println("timeList为空");
            return false;
        }

        List<LocalDateTime> allTimes = new ArrayList<>();

        for (Map<String, String> timeMap : timeList) {
            List<LocalDateTime> times = new ArrayList<>();

            // 收集所有存在的、非空时间点
            if (timeMap.containsKey("prepareTime") && !timeMap.get("prepareTime").trim().isEmpty()) {
                times.add(LocalDateTime.parse(timeMap.get("prepareTime").trim(), formatter));
            }
            if (timeMap.containsKey("travelTime") && !timeMap.get("travelTime").trim().isEmpty()) {
                times.add(LocalDateTime.parse(timeMap.get("travelTime").trim(), formatter));
            }
            if (timeMap.containsKey("startTime") && !timeMap.get("startTime").trim().isEmpty()) {
                times.add(LocalDateTime.parse(timeMap.get("startTime").trim(), formatter));
            }
            if (timeMap.containsKey("completeTime") && !timeMap.get("completeTime").trim().isEmpty()) {
                times.add(LocalDateTime.parse(timeMap.get("completeTime").trim(), formatter));
            }

            // 1:校验单个记录内部时间顺序
            if (!validateSingleRecord(times)) {
                return false;
            }
            // 收集所有时间点用于跨记录校验
            allTimes.addAll(times);
        }

        // 2. 校验所有记录之间的时间顺序
        if (!validateCrossRecords(allTimes)) {
            return false;
        }

        System.out.println("所有时间点校验通过，无重叠");
        return true;
    }

    /**
     * 校验单个记录内部的时间顺序
     * @param times
     * @return
     */
    private static boolean validateSingleRecord(List<LocalDateTime> times) {
        if (times.size() < 2) {
            return true;
        }

        for (int i = 0; i < times.size() - 1; i++) {
            if (!times.get(i + 1).isAfter(times.get(i))) {
                System.out.println("错误：记录内部时间顺序不正确 - " +
                        times.get(i) + " 不应晚于 " + times.get(i + 1));
                return false;
            }
        }
        return true;
    }

    /**
     * 校验跨记录的时间顺序
     * @param allTimes
     * @return
     */
    private static boolean validateCrossRecords(List<LocalDateTime> allTimes) {
        if (allTimes.size() < 2) {
            return true;
        }

        for (int i = 0; i < allTimes.size() - 1; i++) {
            if (!allTimes.get(i + 1).isAfter(allTimes.get(i))) {
                System.out.println("错误：跨记录时间重叠 - " +
                        allTimes.get(i) + " 不应晚于 " + allTimes.get(i + 1));
                return false;
            }
        }
        return true;
    }

}